#include "app_pool.h"

static char *mq_name = "/app_pool_mq";
static mqd_t mq_handler;

static pthread_t *pts;
static int thread_num;

static void *app_pool_thread_func(void *)
{
    Task task;
    // 在每个线程中,就是不断地读取消息队列中的内容,取出并执行
    while (1)
    {
        mq_receive(mq_handler, (char *)&task, sizeof(Task), NULL);
        task.data_handler(task.args);
    }
}

/**
 * 初始化线程池以及创建任务队列
 */
int app_pool_init(int num)
{
    // 创建任务队列
    struct mq_attr attr;
    attr.mq_msgsize = sizeof(Task);
    attr.mq_maxmsg = 10;
    mq_handler = mq_open(mq_name, O_CREAT | O_RDWR, 0644, &attr);
    if (mq_handler == (mqd_t)-1)
    {
        log_error("消息队列创建失败!");
        return -1;
    }

    // 给线程池申请资源
    pts = (pthread_t *)malloc(sizeof(pthread_t) * num);
    if (pts == NULL)
    {
        log_error("线程池申请资源失败!");
        return -1;
    }

    // 创建线程池
    thread_num = num;
    for (int i = 0; i < num; i++)
    {
        pthread_create(&pts[i], NULL, app_pool_thread_func, NULL);
    }

    return 0;
}

/**
 * 取消所有线程以及销毁队列
 */
void app_pool_close(void)
{
    // 销毁队列
    mq_unlink(mq_name);

    // 取消所有线程
    for (int i = 0; i < thread_num; i++)
    {
        pthread_cancel(pts[i]);
    }
}

/**
 * 向消息队列中发送任务信息
 */
int app_pool_add_task(void (*data_handler)(void *), void *args)
{
    Task task = {
        .data_handler = data_handler,
        .args = args,
    };

    // 写入队列
    return mq_send(mq_handler, (char *)&task, sizeof(Task), 1);
}